<!DOCTYPE html>
<html lang="it">
	<head>
		<meta charset="utf-8" />
		<base href="../../../" />
		<script src="page.js"></script>
		<link type="text/css" rel="stylesheet" href="page.css" />
	</head>
	<body>
		<h1>[name]</h1>

		<p>
      Una rappresentazione della geometria di mesh, di linee o di punti. Include posizioni di vertici, indici della faccia,
      normali, colori, coordinate UV, e attributi personalizzati all'interno dei buffer, riducendo il costo del passaggio
      di tutti questi dati alla GPU.
		</p>
		<p>
      Per leggere e modificare dati negli attributi della BufferGeometry, vedi la documentazione di [page:BufferAttribute].
		</p>

		<h2>Codice di Esempio</h2>
		<code>
		const geometry = new THREE.BufferGeometry();
		// crea una semplice figura quadrata. Duplichiamo i vertici top left e bottom right
		// perché ogni vertice ha bisogno di apparire una volta per triangolo.
		const vertices = new Float32Array( [
			-1.0, -1.0,  1.0,
			 1.0, -1.0,  1.0,
			 1.0,  1.0,  1.0,

			 1.0,  1.0,  1.0,
			-1.0,  1.0,  1.0,
			-1.0, -1.0,  1.0
		] );

		// itemSize = 3 perché ci osno 3 valori (componenti) per vertice
		geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );
		const material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );
		const mesh = new THREE.Mesh( geometry, material );
		</code>

		<h2>Esempi</h2>
		<p>
			[example:webgl_buffergeometry Mesh with non-indexed faces]<br />
			[example:webgl_buffergeometry_indexed Mesh with indexed faces]<br />
			[example:webgl_buffergeometry_lines Lines]<br />
			[example:webgl_buffergeometry_lines_indexed Indexed Lines]<br />
			[example:webgl_buffergeometry_custom_attributes_particles Particles]<br />
			[example:webgl_buffergeometry_rawshader Raw Shaders]
		</p>

		<h2>Costruttore</h2>


		<h3>[name]()</h3>
		<div>
      Crea un nuovo [name]. Inoltre imposta alcune proprietà al valore predefinito.
		</div>


		<h2>Proprietà</h2>

		<h3>[property:Object attributes]</h3>
		<p>
      Questo hashmap ha come id il nome dell'attributo da impostare e come valore il [page:BufferAttribute buffer] su cui impostarlo.
      Piuttosto che accedere a questa proprietà direttamente, usa [page:.setAttribute] e [page:.getAttribute] per accedere agli attributi
      della geometria.
		</p>

		<h3>[property:Box3 boundingBox]</h3>
		<p>
      Bounding box per la bufferGeometry, che può essere calcolato con 
      [page:.computeBoundingBox](). Il valore predefinito è `null`.
		</p>

		<h3>[property:Sphere boundingSphere]</h3>
		<p>
      Bounding sphere per la bufferGeometry, che può essere calcolato con 
      [page:.computeBoundingSphere](). Il valore predefinito è `null`.
		</p>

		<h3>[property:Object drawRange]</h3>
		<p>
      Determina la parte della geometria da visualizzare. Non dovrebbe essere impostato
      direttamente, usa invece [page:.setDrawRange]. Il valore predefinito è
			<code>
				{ start: 0, count: Infinity }
			</code>
      Per la BufferGeometry non indicizzata, count è il numero di vertici da visualizzare.
      Per la BufferGeometry indicizzata, count è il numero di indici da visualizzare.
		</p>

		<h3>[property:Array groups]</h3>
		<p>
      Divide la geometria in gruppi, ognuno dei quali verrà renderizzato in una chimata draw WebGL separata.
      Ci permette che un array di materiali venga usato con una geometria.<br /><br />

      Ogni gruppo è un oggetto della forma:
      <code>{ start: Integer, count: Integer, materialIndex: Integer }</code>
      dove start specifica il primo elemento nella chiamata draw - il primo vertice per la geometria non
      indicizzata, altrimenti il primo indice del triangolo. Count specifica quanti vertici (o indici) sono
      inclusi, e materialIndex specifica l'indice dell'array del materiale da utilizzare.<br /><br />

      Usa [page:.addGroup] per aggiungere gruppi, piuttosto che modificare questo array direttamente.<br /><br />

      Ogni vertice e indice deve appartenere esattamente ad un gruppo - i gruppi non devono condividere vertici o
      indici, e non devono lasciare vertici o indici inutilizzati.
		</p>


		<!-- Note: groups used to be called drawCalls

		<h3>[property:Array drawcalls]</h3>
		<p>
		For geometries that use indexed triangles, this Array can be used to split the object
		into multiple WebGL draw calls. Each draw call will draw some subset of the vertices
		in this geometry using the configured [page:Material shader]. This may be necessary if,
		for instance, you have more than 65535 vertices in your object.
		</p> -->


		<h3>[property:Integer id]</h3>
		<p>Numero univoco per questa istanza della bufferGeometry.</p>

		<h3>[property:BufferAttribute index]</h3>
		<p>
      Consente di riutilizzare i vertici su più triangoli; viene chiamato "indexed triangles".
      Ogni triangolo è associato con gli indici di tre vertici. Questo attributo quindi memorizza 
      l'indice di ogni vertice per ogni faccia del triangolo.

      Se questo attributo non è impostato, il [page:WebGLRenderer renderer] assume che ogni 3 posizioni contigue
      rappresentano un singolo triangolo.

      Il valore predefinito è `null`.
		</p>

		<h3>[property:Boolean isBufferGeometry]</h3>
		<p>
      Flag di sola lettura per verificare se un dato oggetto è di tipo [name].
		</p>

		<h3>[property:Object morphAttributes]</h3>
		<p>
      Hashmap di BufferAttribute contenente i dettagli dei target morph delle geometrie.<br />
      Nota: Una volta che la geometria è stata renderizzata, i dati dell'attributo morph non possono essere modificati.
      Dovrai chiamare [page:.dispose](), e creare una nuova istanza della [name].
		</p>

		<h3>[property:Boolean morphTargetsRelative]</h3>
		<p>
      Usato per controllare il comportamento del target morph: quando è impostato a true, i dati del target morph vengono
      trattati come offset relativi, anziché come posizioni/normali assoluti. 
      
      L'impostazione predefinita è `false`.
		</p>

		<h3>[property:String name]</h3>
		<p>
      Nome opzionale per questa istanza di bufferGeometry. Il valore predefinito è una stringa vuota.
		</p>

		<h3>[property:Object userData]</h3>
		<p>
      Un oggetto che può essere utilizzato per memorizzare i dati relativi alla BufferGeometry.
      Non dovrebbe contenere i riferimenti alle funzioni poiché queste non verranno clonate. 
		</p>

		<h3>[property:String uuid]</h3>
		<p>
		[link:http://en.wikipedia.org/wiki/Universally_unique_identifier UUID] di questa istanza.
    Viene assegnato automaticamente e non deve essere modificato.
		</p>

		<h2>Metodi</h2>

		<p>[page:EventDispatcher EventDispatcher] i metodi sono disponibili in questa classe.</p>

		<h3>[method:undefined addGroup]( [param:Integer start], [param:Integer count], [param:Integer materialIndex] )</h3>
		<p>
      Aggiunge un gruppo a questa geometria; vedi la proprietà [page:BufferGeometry.groups groups]
      per maggiori dettagli.
		</p>

		<h3>[method:this applyMatrix4]( [param:Matrix4 matrix] )</h3>
		<p>Applica la matrice di trasformazione alla geometria.</p>

		<h3>[method:this applyQuaternion]( [param:Quaternion quaternion] )</h3>
		<p>Applica la rotazione rappresentata dal quaternione alla geometria.</p>

		<h3>[method:this center] ()</h3>
		<p>Centra la geometria basandosi sul bounding box.</p>

		<h3>[method:undefined clearGroups]( )</h3>
		<p>Cancella tutti i gruppi.</p>

		<h3>[method:BufferGeometry clone]()</h3>
		<p>Crea un clone di questa BufferGeometry.</p>

		<h3>[method:undefined computeBoundingBox]()</h3>
		<p>
      Calcola il bounding box della geometria, aggiornando l'attributo [page:.boundingBox]. <br />
      I Bounding box non sono calcolati per impostazione predefinita. Devono essere calcolati esplicitamente,
      altrimenti sono `null`.
		</p>

		<h3>[method:undefined computeBoundingSphere]()</h3>
		<p>
      Calcola il bounding sphere della geometria, aggiornando l'attributo [page:.boundingSphere]. <br />
      I Bounding sphere non sono calcolati per impostazione predefinita. Devono essere calcolati esplicitamente,
      altrimenti sono `null`.
		</p>

		<h3>[method:undefined computeTangents]()</h3>
		<p>
      Calcola e aggiunge un attributo tangent a questa geometria.<br />
      Il calcolo è supportato solo per geometrie indicizzate e se la posizione, la normale e gli attributi uv sono definiti.
      Quando si usa una mappa normale dello spazio tangente, meglio usare l'algoritmo MikkTSpace fornito da [page:BufferGeometryUtils.computeMikkTSpaceTangents].
		</p>

		<h3>[method:undefined computeVertexNormals]()</h3>
		<p>Calcola la normale dei vertici calcolando la media delle normali delle facce.</p>

		<h3>[method:this copy]( [param:BufferGeometry bufferGeometry] )</h3>
		<p>Copia un'altra BufferGeometry in questa BufferGeometry.</p>

		<h3>[method:BufferAttribute deleteAttribute]( [param:String name] )</h3>
		<p>Cancella l'[page:BufferAttribute attributo] con il nome specificato.</p>

		<h3>[method:undefined dispose]()</h3>
		<p>
      Elimina l'oggetto dalla memoria.<br />
      È necessario chiamarlo quando si desidera rimuovere BufferGeometry mentre l'applicazione è in esecuzione.
		</p>

		<h3>[method:BufferAttribute getAttribute]( [param:String name] )</h3>
		<p>Restituisce l'[page:BufferAttribute attributo] con il nome specificato.</p>

		<h3>[method:BufferAttribute getIndex] ()</h3>
		<p>Restituisce il buffer di [page:.index].</p>

		<h3>[method:Boolean hasAttribute]( [param:String name] )</h3>
		<p>Restituisce `true` se l'attributo con il nome specificato esiste.</p>

		<h3>[method:this lookAt] ( [param:Vector3 vector] )</h3>
		<p>
      vector - Un vettore world da guardare.<br /><br />

      Ruota la geometria in modo che sia rivolta verso un punto dello spazio. In genere, questa operazione viene 
      eseguita una sola volta e non durante un ciclo. 
      Usare [page:Object3D.lookAt] per l'uso tipico della mesh in tempo reale.
		</p>

		<h3>[method:undefined normalizeNormals]()</h3>
		<p>
      Ogni vettore normale, in una geometria, deve avere magnitudine 1.
      Ciò correggerà l'illuminazione sulle superfici geometriche.
		</p>

		<h3>[method:this rotateX] ( [param:Float radians] )</h3>
		<p>
      Ruota la geometria attorno all'asse X. In genere, questa operazione viene eseguita una sola volta e non durante un ciclo. 
      Usare [page:Object3D.rotation] per la tipica rotazione della mesh in tempo reale.
		</p>

		<h3>[method:this rotateY] ( [param:Float radians] )</h3>
		<p>
      Ruota la geometria attorno all'asse Y. In genere, questa operazione viene eseguita una sola volta e non durante un ciclo.
      Usare [page:Object3D.rotation] per la tipica rotazione della mesh in tempo reale.
		</p>

		<h3>[method:this rotateZ] ( [param:Float radians] )</h3>
		<p>
      Ruota la geometria attorno all'asse Z. In genere, questa operazione viene eseguita una sola volta e non durante un ciclo.
      Usare [page:Object3D.rotation] per la tipica rotazione della mesh in tempo reale.
		</p>

		<h3>[method:this scale] ( [param:Float x], [param:Float y], [param:Float z] )</h3>
		<p>
      Scala i dati della geometria. In genere, questa operazione viene eseguita una sola volta e non durante un ciclo.
      Usare [page:Object3D.scale] per il tipico ridimensionamento della mesh in tempo reale.
		</p>

		<h3>[method:this setAttribute]( [param:String name], [param:BufferAttribute attribute] )</h3>
		<p>
      Imposta un attributo per questa geometria. Utilizzare questo metodo piuttosto che la proprietà attributes,
      perché viene mantenuta una hashmap interna di .attributes per accelerare l'iterazione sugli attributi. 
		</p>

		<h3>[method:undefined setDrawRange] ( [param:Integer start], [param:Integer count] )</h3>
		<p>
      Imposta la proprietà [page:.drawRange]. Per BufferGeometry non indicizzate, count è il numero di vertici da visualizzare.
      Per BufferGeometry indicizzate, count è il numero di indici da visualizzare.
    </p>

		<h3>[method:this setFromPoints] ( [param:Array points] )</h3>
		<p>Imposta gli attributi per questa BufferGeometry da un array di punti.</p>

		<h3>[method:this setIndex] ( [param:BufferAttribute index] )</h3>
		<p>Imposta il buffer [page:.index].</p>

		<h3>[method:Object toJSON]()</h3>
		<p>Converte la buffer geometry al formato three.js [link:https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4 JSON Object/Scene].</p>

		<h3>[method:BufferGeometry toNonIndexed]()</h3>
		<p>Restituisce una versione non indicizzata di una BufferGeometry indicizzata.</p>

		<h3>[method:this translate] ( [param:Float x], [param:Float y], [param:Float z] )</h3>
		<p>
      Trasla la geometria. In genere, questa operazione viene eseguita una sola volta e non durante un ciclo.
      Usare [page:Object3D.position] per la tipica traslazione della mesh in tempo reale.
		</p>

		<h2>Source</h2>

		<p>
			[link:https://github.com/mrdoob/three.js/blob/master/src/[path].js src/[path].js]
		</p>
	</body>
</html>
